home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
gfx
/
misc
/
gnuplot-3.7src.lha
/
gnuplot-3.7src
/
gnuplot-3.7.lha
/
gnuplot-3.7
/
term
/
mif.trm
< prev
next >
Wrap
Text File
|
1999-01-12
|
26KB
|
893 lines
/*
* $Id: $
*/
/* GNUPLOT -- mif.trm */
/*[
* Copyright 1992, 1993, 1998
*
* Permission to use, copy, and distribute this software and its
* documentation for any purpose with or without fee is hereby granted,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.
*
* Permission to modify the software is granted, but not the right to
* distribute the complete modified source code. Modifications are to
* be distributed as patches to the released version. Permission to
* distribute binaries produced by compiling modified sources is granted,
* provided you
* 1. distribute the corresponding source modifications from the
* released version in the form of a patch file along with the binaries,
* 2. add special version identification to distinguish your version
* in addition to the base release version number,
* 3. provide your name and address as the primary contact for the
* support of your modified version, and
* 4. retain our contact information in regard to use of the base
* software.
* Permission to distribute the released version of the source code along
* with corresponding source modifications in the form of a patch file is
* granted with same provisions 2 through 4 for binary distributions.
*
* This software is provided "as is" without express or implied warranty
* to the extent permitted by applicable law.
]*/
/*
* This file is included by ../term.c.
*
* This terminal driver was developed for
* gnuplot for unix version 3.0 (patchlevel 1)
* gnuplot for unix version 3.2 (patchlevel 2)
*
* This terminal driver supports:
* Frame Maker MIF format version 3.00
*
* Options for this terminal driver (set terminal mif [options]):
* colour / Draw primitives with line types >= 0 in colour (sep. 2-7)
* monochrome Draw primitives in black (sep. 0)
*
* polyline / Draw lines as continous curves
* vectors Draw lines as collections of vectors
*
* help / ? Print short usage description on stderr
*
* Properties for this terminal driver:
* -Gnuplot size of worksheet: MIF_XMAX * MIF_YMAX
* -Unit in MIF output: cm
* -Plot primitives with the same pen will
* be grouped in the same MIF group.
* -Plot primitives with line types >= 0
* will as default be drawn in colour.
* -Lines are plotted as collections of
* vectors, or as continous lines (default)
* -Plot primitives in a plot will be in a
* Frame in MIF. Several plot Frames will
* be collected in one large Frame.
* -Point size of MIF output characters: MIF_PSIZE
* -Used font for MIF output characters: Times
* -Supports vertical text
* -points and dots as characters
* -character formats for TextLines
*
* AUTHORS:
* Olof Franksson, Physics IV, KTH, S-100 44 Stockholm, Sweden
*
* NEW TERMINAL FORMAT: David C. Schooley
* COMMENTS:
* Send comments and/or suggestions to olof@fysik4.kth.se
*
* CHANGES:
* Changed to new terminal format 9/29/95 schooley@ee.gatech.edu
* Changed order of routine declarations. olof@fysik4.kth.se
* Changed mechanism for pen pattern selection. kssingvo@immd4.informatik.uni-erlangen.de
* Support for vertical text. kssingvo@immd4.informatik.uni-erlangen.de
* Fixed plot bug for "set size XS,YS", XS/YS > 1. olof@fysik4.kth.se
*
*/
#include "driver.h"
#ifdef TERM_REGISTER
register_term(mif)
#endif
#ifdef TERM_PROTO
TERM_PUBLIC void MIF_init __PROTO((void));
TERM_PUBLIC void MIF_graphics __PROTO((void));
TERM_PUBLIC void MIF_text __PROTO((void));
TERM_PUBLIC void MIF_linetype __PROTO((int linetype));
TERM_PUBLIC void MIF_move __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void MIF_vector __PROTO((unsigned int x, unsigned int y));
TERM_PUBLIC void MIF_put_text __PROTO((unsigned int x, unsigned int y, char *str));
TERM_PUBLIC int MIF_text_angle __PROTO((int ang));
TERM_PUBLIC void MIF_reset __PROTO((void));
TERM_PUBLIC void MIF_options __PROTO((void));
TERM_PUBLIC int MIF_justify_text __PROTO((enum JUSTIFY mode));
TERM_PUBLIC void MIF_point __PROTO((unsigned int x, unsigned int y, int number));
/** Coordinates **/
/* The cast to float is not necessary because we are dividing by a float */
/* On OSK the cast to a float is not allowed in a constant expression wich */
/* is used by the declaration and initialization of mif_line */
/* Converts gnuplot units to MIF units */
#define GNP_TO_MIF(P) ((P) / 1000.0)
/* Basic unit: 0.01 mm (15cm -> 15*10*100=15000) */
#define MIF_XMAX 15000
/* Basic unit: 0.01 mm (10cm -> 10*10*100=10000) */
#define MIF_YMAX 10000
#define MIF_XLAST (MIF_XMAX - 1)
#define MIF_YLAST (MIF_YMAX - 1)
static int insert_mif_line __PROTO((double fx, double fy));
static int proc_group_id __PROTO((int group_id));
static void free_mif_line __PROTO((void));
static void put_mif_line __PROTO((void));
static void MIF_set_font __PROTO((char *));
static void mif_put_point __PROTO((unsigned int x, unsigned int y, int np));
#ifndef cfree
# define cfree free
#endif
/* Declared in ../setshow.c */
extern char term_options[];
/* From version.c */
extern char version[];
extern char patchlevel[];
static struct mif_line { /* Line point structure specification */
float fpos_x; /* Line point X coordinate */
float fpos_y; /* Y coordinate */
struct mif_line *next; /* Pointer to next line point */
struct mif_line *prev; /* Pointer to previous line point */
} mif_line =
{ /* Current position structure. Adjust for orign. Local for this file. */
GNP_TO_MIF(0),
GNP_TO_MIF(MIF_YLAST),
&mif_line,
&mif_line
};
/** Characters **/
#define MIF_PSIZE 9 /* Point size of used characters */
#define MIF_VCHAR (MIF_YMAX/31) /* Distance between rows (a guess) */
#define MIF_HCHAR (MIF_XMAX/95) /* Distance between characters (a guess) */
/** Scale marks **/
#define MIF_VTIC (MIF_YMAX/150) /* Size of scale mark (vert) */
#define MIF_HTIC (MIF_XMAX/225) /* Size of scale mark (hor) */
/** Drawing properties **/
static char mif_justify[64]; /* How to justify the used text */
static char mif_pen[64], mif_pen_width[64], mif_separation[64]; /* How to plot */
#define MIF_TEXT_HOR 0
#define MIF_TEXT_VER 1
static int mif_text_ang = MIF_TEXT_HOR; /* Rotation angle of text */
#define MIF_NPENS 16 /* Number of MIF pen types */
static int mif_pentype = 0; /* Pen type to use. Also used to create groups for graphics */
#define MIF_PEN_TO_GROUP(P) ( 1 + (P) ) /* Map pen type to group number. Must be >= 1 */
static int mif_pattern_table[MIF_NPENS] =
{ /* Table, which pattern should be used for drawing */
0, /* border */
1, /* not used */
2, 3, 4, 8, 12, 13, /* other lines: functions, data, ... (5 is used for grid; 6,7 is (nearly) invisible) */
5, /* grid */
9, 10, 11, 12, 13, 14, 15 /* not used */
};
/** MIF groups administration **/
#define MIF_NGROUP_ID 20
static struct mif_group_id {
int group_existance;
/* This group id should generate a MIF group */
#define MIF_GROUP_EXISTS 1
/* This group id should not generate a MIF group */
#define MIF_GROUP_NOT_EXISTS 0
int group_id;
#define MIF_INVALID_GROUP_ID 0 /* An invalid MIF group ID */
} mif_group_id[MIF_NGROUP_ID]; /* List of used group ID:s and corresponding MIF groups existance */
/** Semaphores **/
static int mif_initialized = 0; /* != 0 when output is active */
static int mif_in_frame = 0; /* != 0 when inside a plot frame */
static int mif_frameno = -1; /* Current frame number */
static int mif_colour = TRUE; /* == TRUE when colour should be used */
static int mif_polyline = TRUE; /* == TRUE when lines are drawn as continous curves */
struct mpt { /* point definition structure */
int chr; /* character for point */
float x_offset, y_offset; /* offset for vertical positioning */
char *font; /* font */
};
char zgnuplot[] = "ZGnuplot"; /* character formats */
char zgnuplotp[] = "ZGnuplotP";
char zgnuplotd[] = "ZGnuplotD";
char *mif_font = NULL; /* actual character format */
struct mpt mpt[POINT_TYPES + 1] =
{ /* point definition data */
{'.', 0.000, 0.005, zgnuplotd, /* dot */ },
{'G', 0.002, 0.084, zgnuplotp, /* diamond */ },
{';', 0.002, 0.084, zgnuplotp, /* plus */ },
{'n', 0.002, 0.084, zgnuplotp, /* box */ },
{'5', 0.002, 0.084, zgnuplotp, /* X */ },
{'s', 0.002, 0.062, zgnuplotp, /* triangle */ },
{'K', 0.005, 0.075, zgnuplotp, /* star */ },
};
/* diamond is offset 0, dot is offset -1 */
struct mpt *mif_point = &(mpt[1]);
#endif
#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY
/** Declaration of routine/s for internal use **/
static int insert_mif_line __PROTO((double fx, double fy));
static int proc_group_id __PROTO((int group_id));
/** Routine/s **/
/* Called when this terminal type is set in order to parse options */
TERM_PUBLIC void MIF_options()
{
if (!END_OF_COMMAND) {
/* Colour options */
if (!END_OF_COMMAND && almost_equals(c_token, "m$onochrome")) { /* Compare up to $ */
mif_colour = FALSE;
c_token++;
}
if (!END_OF_COMMAND && (almost_equals(c_token, "c$olor")
|| almost_equals(c_token, "c$olour"))) { /* Compare up to $ */
mif_colour = TRUE;
c_token++;
}
/* Curve options */
if (!END_OF_COMMAND && almost_equals(c_token, "v$ectors")) { /* Compare up to $ */
mif_polyline = FALSE;
c_token++;
}
if (!END_OF_COMMAND && almost_equals(c_token, "p$olyline")) { /* Compare up to $ */
mif_polyline = TRUE;
c_token++;
}
/* Short help */
if (!END_OF_COMMAND &&
(almost_equals(c_token, "h$elp") ||
almost_equals(c_token, "?$"))) { /* Compare up to $ */
fprintf(stderr, "\
Usage: set terminal mif [options]\n\
\toptions:\n\
\t\tcolour / Draw primitives with line types >= 0 in colour (sep. 2-7)\n\
\t\tmonochrome Draw primitives in black (sep. 0)\n\n\
\t\tpolyline / Draw lines as continous curves\n\
\t\tvectors Draw lines as collections of vectors\n\n\
\t\thelp / ? Print short usage description on stderr\n");
c_token++;
}
}
sprintf(term_options, "%s %s", (mif_colour == TRUE) ? "colour" : "monochrome",
(mif_polyline == TRUE) ? "polyline" : "vectors");
}
/* Deallocate the used line structure elements */
static void free_mif_line()
{
struct mif_line *tline;
while (mif_line.prev != &mif_line) {
/* Unlink */
tline = mif_line.prev;
mif_line.prev = mif_line.prev->prev;
mif_line.prev->next = &mif_line;
/* Deallocate */
free(tline);
}
/* Make sure that the list will be empty */
mif_line.prev = &mif_line;
mif_line.next = &mif_line;
}
/* Draw the pending line. Change current position. */
static void put_mif_line()
{
int np, i;
struct mif_line *tline;
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Count the number of available points */
for (tline = mif_line.next, np = 1; tline != &mif_line; tline = tline->next, np++);
/* Draw line (at least two points) */
if (np >= 2) {
/* Line preamble */
fprintf(gpoutfile, "\t<PolyLine <GroupID %d> %s %s %s\n",
MIF_PEN_TO_GROUP(mif_pentype), mif_pen, mif_pen_width, mif_separation);
/* Draw the line elements */
fprintf(gpoutfile, "\t\t<NumPoints %d> ", np);
for (i = 0, tline = &mif_line; i < np; i++, tline = tline->next) {
if (i % 4 == 0)
fputs("\n\t\t", gpoutfile);
fprintf(gpoutfile, "<Point %.3f %.3f> ",
tline->fpos_x, tline->fpos_y);
}
/* Line post amble */
fputs("\n\t>\n", gpoutfile);
/* Register the used group ID */
proc_group_id(MIF_PEN_TO_GROUP(mif_pentype));
/* Avoid to redraw this. The MIF system should remember it. */
mif_pen[0] = '\0';
mif_pen_width[0] = '\0';
mif_separation[0] = '\0';
/* Move current position to end of line */
mif_line.fpos_x = mif_line.prev->fpos_x;
mif_line.fpos_y = mif_line.prev->fpos_y;
/* Restore the line */
free_mif_line();
}
} /* Line processed */
}
/* Draw a point */
static void mif_put_point(x, y, np)
unsigned int x, y;
int np;
{
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Draw pending line */
if (mif_polyline == TRUE)
put_mif_line();
/* Adjust current position for text-graphics alignment */
MIF_move(x, y);
/* center text */
MIF_justify_text(CENTRE);
/* Draw the point */
fprintf(gpoutfile, "\t<TextLine <GroupID %d>\n",
MIF_PEN_TO_GROUP(mif_pentype));
MIF_set_font(mif_point[np].font);
fprintf(gpoutfile, "\t\t<TLOrigin %.3f %.3f> %s <String `%c'>\n",
mif_line.fpos_x + mif_point[np].x_offset,
mif_line.fpos_y + mif_point[np].y_offset,
mif_justify,
mif_point[np].chr);
fputs("\t>\n", gpoutfile);
/* Register the used group ID */
proc_group_id(MIF_PEN_TO_GROUP(mif_pentype));
/* Avoid to redraw this. The MIF system should remember it. */
mif_justify[0] = '\0';
} /* Point processed */
}
/*
* draw points
*/
TERM_PUBLIC void MIF_point(x, y, number)
unsigned int x, y;
int number;
{
if (number < 0) { /* dot */
number = -1;
} else { /* point */
number %= POINT_TYPES;
}
mif_put_point(x, y, number);
}
/* Set up a MIF output file */
TERM_PUBLIC void MIF_init()
{
int i;
/* Process if not inside a MIF file and Frame */
if (mif_initialized == 0 && mif_in_frame == 0) {
/* Tell this terminal driver that the output is initialized and no current frames are processed */
mif_initialized = 1;
mif_in_frame = 0;
/* Reset internal position */
free_mif_line();
mif_line.fpos_x = GNP_TO_MIF(0);
mif_line.fpos_y = GNP_TO_MIF(MIF_YLAST);
/* Reset drawing properties strings */
mif_pen[0] = '\0';
mif_pen_width[0] = '\0';
mif_separation[0] = '\0';
MIF_justify_text(LEFT);
/* Reset group ID generator */
for (i = 0; i < MIF_NGROUP_ID; i++) {
mif_group_id[i].group_id = MIF_INVALID_GROUP_ID;
mif_group_id[i].group_existance = MIF_GROUP_NOT_EXISTS;
}
/* Identify ourselves */
/*bs show borders */
/* Setup a default environment to use */
fprintf(gpoutfile, "\
<MIFFile 3.00> # Generated by gnuplot version %s patchlevel %s; identifies this as a MIF file\n\
#\n\
# show borders\n\
<Document\n<DBordersOn Yes>\n>\n\
# Set a default pen pattern, pen width, unit and font for subsequent objects\n\
<Pen 0>\n\
<Fill 15>\n\
<PenWidth 0.5 pt>\n\
<Separation 0>\n\
<Units Ucm>\n\
<FontCatalog\n\
\t<Font <FTag `%s'><FFamily `Times'><FSize %d><FPlain Yes>>\n\
\t<Font <FTag `%s'><FFamily `ZapfDingbats'><FSize 7.0 pt><FPlain Yes>>\n\
\t<Font <FTag `%s'><FFamily `Symbol'><FSize 5.0 pt><FPlain Yes>>\n\
>\n\
#\n",
version, patchlevel,
zgnuplot, MIF_PSIZE,
zgnuplotp,
zgnuplotd);
} /* MIF file created */
}
/* Finish of a MIF output file */
TERM_PUBLIC void MIF_reset()
{
/* Process if inside a MIF file and not inside a Frame */
if (mif_initialized != 0 && mif_in_frame == 0) {
/* Finish off the MIF file */
fputs("\
#\n\
# End of MIFFile\n", gpoutfile);
/* Tell this terminal driver that the output is finished */
mif_initialized = 0;
/* bs: reset frame number */
mif_frameno = -1;
} /* MIF file finished */
}
/* Start plotting a Frame (-> graphics mode) */
TERM_PUBLIC void MIF_graphics()
{
int i;
/* Process if not inside a Frame */
if (mif_initialized != 0 && mif_in_frame == 0) {
/* Tell that this terminal driver is working with a plot frame */
mif_in_frame = 1;
/* Update frame number */
mif_frameno++;
/* Set current position */
free_mif_line();
mif_line.fpos_x = GNP_TO_MIF(0);
mif_line.fpos_y = GNP_TO_MIF(MIF_YLAST);
/* Set drawing properties */
mif_pen[0] = '\0';
mif_pen_width[0] = '\0';
mif_separation[0] = '\0';
MIF_justify_text(LEFT);
/* Reset group ID generator */
for (i = 0; i < MIF_NGROUP_ID; i++) {
mif_group_id[i].group_id = MIF_INVALID_GROUP_ID;
mif_group_id[i].group_existance = MIF_GROUP_NOT_EXISTS;
}
/* Frame preamble */
fprintf(gpoutfile, "\
#\n\
# Frame number %d with plot of graphics\n\
<Frame\n\
\t<Pen 15>\n\
\t<Fill 15>\n\
\t<PenWidth 0.5 pt>\n\
\t<Separation 0>\n\
\t<BRect 2.000 %.3f %.3f %.3f>\n\
\t<NSOffset 0.000>\n\
\t<BLOffset 0.000>\n",
mif_frameno,
((float) mif_frameno) * GNP_TO_MIF(MIF_YMAX + 100),
GNP_TO_MIF(MIF_XMAX), GNP_TO_MIF(MIF_YMAX));
} /* Frame created */
}
/* Stop plotting a Frame (-> text mode) */
TERM_PUBLIC void MIF_text()
{
int i;
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Draw pending line */
if (mif_polyline == TRUE)
put_mif_line();
/* Group the used plot primitives */
fputs("\
\t#\n\
\t# Group the the objects in groups to make the chart easier to manipulate\n\
\t# after it's imported into FrameMaker.\n", gpoutfile);
for (i = 0; i < MIF_NGROUP_ID; i++) {
if (mif_group_id[i].group_id != MIF_INVALID_GROUP_ID &&
mif_group_id[i].group_existance == MIF_GROUP_EXISTS) {
fprintf(gpoutfile, "\
\t<Group\n\
\t\t<ID %d>\n\
\t>\n", mif_group_id[i].group_id);
}
}
/* Frame post amble */
fprintf(gpoutfile, "\
>\n\
# End of Frame number %d\n\
#\n",
mif_frameno);
/* Tell that this terminal driver is not working with a plot frame */
mif_in_frame = 0;
} /* Frame finshed */
}
/* Select type of line in grapics */
/* NOTE: actually written to output the first time a primitive
* is drawn AFTER this call */
TERM_PUBLIC void MIF_linetype(linetype)
/* -2=border, -1=X/Y-axis, 0-13=lines, and 14-=mapped back */
int linetype;
{
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Draw pending line */
if (mif_polyline == TRUE)
put_mif_line();
/* Translate gnuplot pen types to MIF pen types */
if (linetype < 0) { /* Special lines */
if (linetype == -1) {
mif_pentype = 8 + MIF_NPENS; /* -1 */
if (mif_colour == TRUE)
sprintf(mif_separation, " <Separation 0> ");
} else {
mif_pentype = 0 + MIF_NPENS; /* -2 or less */
if (mif_colour == TRUE)
sprintf(mif_separation, " <Separation 0> ");
}
sprintf(mif_pen_width, " <PenWidth 1.0 pt> ");
} else { /* Normal lines */
mif_pentype = (linetype) % MIF_NPENS; /* 0-(MIF_NPENS-1) */
sprintf(mif_pen_width, " <PenWidth 0.1 pt> ");
if (mif_colour == TRUE)
sprintf(mif_separation, " <Separation %d> ", 2 + (mif_pentype % 6)); /* 2-7 */
}
/* Set pen type */
sprintf(mif_pen, " <Pen %d> ", mif_pattern_table[mif_pentype % MIF_NPENS]);
} /* Primitive processed */
}
/* Draw the text horisontally or vertically (90 degrees counterclockwise) */
TERM_PUBLIC int MIF_text_angle(ang)
int ang;
{
if (ang != 0)
mif_text_ang = MIF_TEXT_VER;
else
mif_text_ang = MIF_TEXT_HOR;
return (TRUE);
}
/* Justify following text lines (MIF_put_text()) relative to the insertion point */
TERM_PUBLIC int MIF_justify_text(mode)
/* NOTE: actually written to output in text primitives which are
* drawn AFTER this call */
enum JUSTIFY mode;
{
int rval = TRUE;
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
switch (mode) {
case LEFT:
sprintf(mif_justify, " <TLAlignment Left> ");
break;
case CENTRE:
sprintf(mif_justify, " <TLAlignment Center> ");
break;
case RIGHT:
sprintf(mif_justify, " <TLAlignment Right> ");
break;
default:
rval = FALSE;
break;
}
}
/* Primitive processed */
else {
rval = FALSE;
}
return (rval);
}
/* Draw a vector from current position to (x, y) and change current position. */
/* NOTE: actually written to output the first time another primitive
* is called AFTER this call */
TERM_PUBLIC void MIF_vector(x, y)
unsigned int x, y;
{
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Setup the vector as a part of the line */
insert_mif_line(GNP_TO_MIF(x), GNP_TO_MIF(MIF_YLAST - (int) y));
/* Draw pending line -> vector */
if (mif_polyline == FALSE)
put_mif_line();
} /* Vector processed */
}
/* Move current position */
TERM_PUBLIC void MIF_move(x, y)
unsigned int x, y;
{
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Draw pending line */
if (mif_polyline == TRUE)
put_mif_line();
mif_line.fpos_x = GNP_TO_MIF(x);
mif_line.fpos_y = GNP_TO_MIF(MIF_YLAST - (int) y);
}
}
/* set font */
static void MIF_set_font(font)
char *font;
{
if (font != mif_font) {
fprintf(gpoutfile, "\t\t<Font\n\t\t\t<FTag `%s'>\n\t\t>\n", font);
mif_font = font;
}
}
/* Draw the text string str at (x, y). Adjust according to MIF_justify_text().
* Change current position. */
TERM_PUBLIC void MIF_put_text(x, y, str)
unsigned int x, y;
char str[];
{
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Draw pending line */
if (mif_polyline == TRUE)
put_mif_line();
/* Adjust current position for text-graphics alignment */
MIF_move(x, y - MIF_VCHAR / 5);
if (strlen(str) > 0) {
/* Draw the text */
fprintf(gpoutfile, "\t<TextLine <GroupID %d> %s %s %s\n",
MIF_PEN_TO_GROUP(mif_pentype), mif_pen,
mif_pen_width, mif_separation);
MIF_set_font(zgnuplot);
fprintf(gpoutfile, "\
\t\t<TLOrigin %.3f %.3f> %s %s <String `%s'>\n\
\t>\n",
mif_line.fpos_x, mif_line.fpos_y, mif_justify,
(mif_text_ang == MIF_TEXT_VER) ? "<Angle 90>" : "",
str);
/* Register the used group ID */
proc_group_id(MIF_PEN_TO_GROUP(mif_pentype));
/* Avoid to redraw this. The MIF system should remember it. */
mif_pen[0] = '\0';
mif_pen_width[0] = '\0';
mif_separation[0] = '\0';
mif_justify[0] = '\0'; /* Independent of linetype */
}
} /* Text processed */
}
/* Insert one point in the line */
static int insert_mif_line(fx, fy)
double fx, fy;
{
int rval = TRUE;
if ((mif_line.prev->next = (struct mif_line *) gp_alloc(sizeof(struct mif_line),
"MIF driver")) != (struct mif_line *) NULL) {
/* Link */
mif_line.prev->next->next = &mif_line;
mif_line.prev->next->prev = mif_line.prev;
mif_line.prev = mif_line.prev->next;
/* Fill */
mif_line.prev->fpos_x = fx;
mif_line.prev->fpos_y = fy;
rval = TRUE;
} else { /* Failed to allocate */
/* Relink */
mif_line.prev->next = &mif_line;
rval = FALSE;
}
return (rval);
}
/* Register group ID. Update group ID existance. */
/* Returns: 1 group_id belongs to a MIF group
0 group_id does not belong to a MIF group
-1 not inside a Frame
-2 group ID list is full
*/
static int proc_group_id(group_id)
int group_id;
{
int i, rval = 0;
/* Process if inside a Frame */
if (mif_initialized != 0 && mif_in_frame != 0) {
/* Find out the group ID, or a free group ID slot index. */
for (i = 0; i < MIF_NGROUP_ID &&
mif_group_id[i].group_id != MIF_INVALID_GROUP_ID &&
mif_group_id[i].group_id != group_id;
i++) {
/* Don't check the group_existance variable */
}
if (i < MIF_NGROUP_ID) {
if (mif_group_id[i].group_id == MIF_INVALID_GROUP_ID) {
/* Register as new group ID for eventual use as MIF group */
mif_group_id[i].group_id = group_id;
mif_group_id[i].group_existance = MIF_GROUP_NOT_EXISTS;
} else {
/* If second use of this group ID -> create a new MIF group */
if (mif_group_id[i].group_id == group_id) {
mif_group_id[i].group_existance = MIF_GROUP_EXISTS;
/* NOTE: a group MUST have at least two members. */
rval = 1;
}
}
} else {
rval = -2; /* No place for this group ID in the list */
}
}
/* Group ID processed */
else {
rval = -1; /* Not inside a Frame */
}
/* Return MIF group status */
return (rval);
}
#endif
#ifdef TERM_TABLE
TERM_TABLE_START(mif_driver)
"mif", "Frame maker MIF 3.00 format",
MIF_XMAX, MIF_YMAX, MIF_VCHAR, MIF_HCHAR,
MIF_VTIC, MIF_HTIC, MIF_options, MIF_init, MIF_reset,
MIF_text, null_scale, MIF_graphics, MIF_move, MIF_vector,
MIF_linetype, MIF_put_text, MIF_text_angle,
MIF_justify_text, MIF_point, do_arrow, set_font_null
TERM_TABLE_END(mif_driver)
#undef LAST_TERM
#define LAST_TERM mif_driver
#endif
#endif /* TERM_PROTO_ONLY */
#ifdef TERM_HELP
START_HELP(mif)
"1 mif",
"?commands set terminal mif",
"?set terminal mif",
"?set term mif",
"?terminal mif",
"?term mif",
"?mif",
" The `mif` terminal driver produces Frame Maker MIF format version 3.00. It",
" plots in MIF Frames with the size 15*10 cm, and plot primitives with the same",
" pen will be grouped in the same MIF group. Plot primitives in a `gnuplot`",
" page will be plotted in a MIF Frame, and several MIF Frames are collected in",
" one large MIF Frame. The MIF font used for text is \"Times\".",
"",
" Several options may be set in the MIF 3.00 driver.",
"",
" Syntax:",
" set terminal mif {colour | monochrome} {polyline | vectors}",
" {help | ?}",
"",
" `colour` plots lines with line types >= 0 in colour (MIF sep. 2--7) and",
" `monochrome` plots all line types in black (MIF sep. 0).",
" `polyline` plots curves as continuous curves and `vectors` plots curves as",
" collections of vectors.",
" `help` and `?` print online help on standard error output---both print a",
" short description of the usage; `help` also lists the options;",
"",
" Examples:",
" set term mif colour polylines # defaults",
" set term mif # defaults",
" set term mif vectors",
" set term mif help"
END_HELP(mif)
#endif /* TERM_HELP */